#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>

static void int_handler(int s)
{
	write(1, "!",1);
}

int main()
{
	int i;
	sigset_t set, oset, saveset;
	sigset_t tmpset;
	//设置信号行为
	signal(SIGINT, int_handler);
	//把SIGINT加入set信号集
	sigemptyset(&set);
	sigaddset(&set, SIGINT);
	//SIGINT设为通，保存最初信号集
	sigprocmask(SIG_UNBLOCK, &set, &saveset);
	//SIGINT设为阻塞，保存刚才的信号集
	sigprocmask(SIG_BLOCK, &set, &oset);
	//循环
	while(1)
	{
		//打印5个*号并回车
		for(i = 0; i < 5; i ++)
		{
			sleep(1);
			write(1, "*", 1);
		}
		write(1, "\n", 1);

		//设置为旧的信号集（SIGINT为通），保存到tmp信号集（SIGINT为阻塞）
		sigprocmask(SIG_SETMASK, &oset, &tmpset);
		pause();//等待信号的到来
		//把tmpset里的信号设置为阻塞
		sigprocmask(SIG_BLOCK, &tmpset, NULL);
	}

	//恢复最初的模样
	sigprocmask(SIG_SETMASK, &saveset, NULL);
	
	exit(0);
}
